package pers.xukai.common.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 翻译工具类
 */
@Component
public class TranslateUtils {
    /**
     * api地址
     */
    private static String transUrl;

    /**
     * 应用id
     */
    private static String appKey;

    /**
     * 应用密钥
     */
    private static String secret;

    /**
     * 自动识别
     */
    public static final String AUTO = "auto";

    /**
     * 中文简体
     */
    public static final String ZH_CHS = "zh-CHS";

    /**
     * 中文繁体
     */
    public static final String ZH_CHT = "zh-CHT";

    /**
     * 英文
     */
    public static final String EN = "en";

    /**
     * 日文
     */
    public static final String JA = "ja";

    /**
     *
     * 指定源语言及目标语言翻译文字
     * @param word     要翻译的文字
     * @param fromLang 源语言
     * @param toLang   目标语言
     * @return
     */
    public static List<String> translate(String word, String fromLang, String toLang) {
        if (StrUtil.isEmpty(fromLang)) {
            fromLang = AUTO;
        }
        if (StrUtil.isEmpty(toLang)) {
            toLang = AUTO;
        }
        String curTime = String.valueOf(System.currentTimeMillis() / 1000);
        String uuid = UUID.randomUUID().toString();
        String sign = SecureUtil.sha256(appKey + truncate(word) + uuid + curTime + secret);
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("q", word);
        paramMap.put("from", fromLang);
        paramMap.put("to", toLang);
        paramMap.put("appKey", appKey);
        paramMap.put("salt", uuid);
        paramMap.put("sign", sign);
        paramMap.put("signType", "v3");
        paramMap.put("curtime", curTime);
        String body = HttpRequest.post(transUrl).form(paramMap).execute().body();
        HashMap resultMap = JSONUtil.toBean(body, HashMap.class);
        return (List) resultMap.get("translation");
    }

    /**
     * 自动识别源语言并翻译为中文
     * @param word 需要翻译的文字
     * @return
     */
    public static List<String> autoTrans(String word) {
        return translate(word, AUTO, ZH_CHS);
    }

    /**
     * 根据源语言及目标语言返回唯一翻译
     * @param word 需要翻译的文字
     * @param fromLang 源语言
     * @param toLang 目标语言
     * @return
     */
    public static String onlyTrans(String word, String fromLang, String toLang){
        List<String> translates = translate(word, fromLang, toLang);
        if (CollUtil.isEmpty(translates)){
            return "";
        }
        return translates.get(0);
    }

    /**
     * 自动识别文字翻译为中文
     * @param word 要翻译的文字
     * @return
     */
    public static String autoOnlyTrans(String word){
        List<String> trans = autoTrans(word);
        if (CollUtil.isEmpty(trans)){
            return "";
        }
        return trans.get(0);
    }


    @Value("${k-full-mark.trans.api}")
    private void setTransUrl(String transUrl) {
        TranslateUtils.transUrl = transUrl;
    }

    @Value("${k-full-mark.trans.appKey}")
    private void setAppKey(String appKey) {
        TranslateUtils.appKey = appKey;
    }

    @Value("${k-full-mark.trans.secret}")
    private void setSecret(String secret) {
        TranslateUtils.secret = secret;
    }

    /**
     * 截断文字
     * @param q 要截断的文字
     * @return
     */
    public static String truncate(String q) {
        if (q == null) {
            return null;
        }
        int len = q.length();
        return len <= 20 ? q : (q.substring(0, 10) + len + q.substring(len - 10, len));
    }
}
